/*
 * io.c
 *
 *  Created on: 02/09/2010
 *      Author: Wendell
 */

#include <io.h>

/**
 * 	Função para ler as portas E/S para obter dados de
 *  dispositivos, como por exemplo, o teclado.
 *  Utilizando 'inline assembly' para fazer o trabalho.
 */
unsigned char inportb (unsigned short _port) {
    unsigned char rv;
    __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
    return rv;
}

/**
 * Função para escrever em portas E/S para enviar dados para dispositivos.
 * Usando novamente inline assembly para uma coisa que simplesmente
 * não pode ser feita em C
 */
void outportb (unsigned short _port, unsigned char _data) {
    __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

// Aguarda pela operacao de IO, ateh ela se completar
void port_wait(void) {
   __asm__ __volatile__ ("jmp 1f; 1: jmp 1f;1:");
}

// Escreve nas portas IO e aguarda
void outport_wait(unsigned short port, unsigned char val) {
   outportb(port, val);
   port_wait();
}

// Le das portas IO e aguarda
unsigned char inport_wait(unsigned short port) {
   unsigned char ret;
   ret = inportb(port);
   port_wait();
   return ret;
}
